hist(rnorm(200),col='blue',border='yellow',main='测试',xlab='标签')

par(mfrow=c(2,3))
for (i in 1:6) {hist(rnorm(200),border='yellow',col='blue',main='',xlab='')}



# 测试

# 创建一个3x3的矩阵
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3, ncol = 3)
print(my_matrix)

# 创建一个包含矩阵和向量的列表
my_list <- list(matrix(c(1, 2, 3, 4), nrow = 2), c(5, 6, 7))
print(my_list)

list01 <- list(1,2,4)
print(list01)

my_vector <- c(1, 2, 3, 4)
my_array <- array(my_vector, dim = c(4))
print(my_array)

library()

# 创建向量
sites <- c("Google","Runoob","Taobao")
likes <- c(222,111,123)
url <- c("www.google.com","www.runoob.com","www.taobao.com")

# 将向量组合成数据框
addresses <- cbind(sites,likes,url)

# 查看数据框
print(addresses)


demo(graphics)

help('mean')

getwd()

?base

library(help = 'base')

help(package="base")

help(package="car")

install.packages("car")

head(cars)

head(mtcars)

result <- lm(mpg~wt,data = mtcars)

summary(result)

getwd()

predict(result,mynewdata)

?predict

###############################0918 三种数据类型：数组 & 向量 & 矩阵
## 相同点：其中元素类型要一致
?matrix
y <- matrix(5:24,nrow = 4, ncol = 5)

x <- c(2,45,68,94,23,55)
rname <- c("r1","r2","r3","r4")
cname <- c("c1","c2","c3","c4","c5","c6")
newMatrix <- matrix(x,nrow = 3,ncol = 2, byrow = TRUE, dimnames=(list(rname,cname)))

print(newMatric)
# 矩阵2
rname <- c("r1","r2","r3","r4")
cname <- c("c1","c2","c3","c4","c5","c6")
x <- matrix(1:22, nrow = 4,dimnames = list(rname,cname))
print(x)

print(x[2,1])

# 数组 维度高于 矩阵，数组就是矩阵的扩充

?array

dim1 <- c("a1","a2","a3")
dim2 <- c("b1","b2","b3")
dim3 <- c("c1","c2","c3","c4")
d <- array(1:36, c(3,3,4),dimnames = (list(dim1,dim2,dim3)))
print(d)
plot(d)
# d[第几行，第几列，第几个矩阵]
# d[x,y,z]:z个[x,y]的矩阵

################################0919 数据框 因子 列表
## 数据框 能够存不同类型的元素
?frame
patientID <- c(1,2,3,4)
age <- c(24,36,42,52)
diabetes <- c("Type1","Type2","Type3","Type4")
status <- c("poor","improved","great","error")
patientsData <- data.frame(patientID,age,diabetes,status)
# 三种从 数据框 中获取数据的方式
patientsData[1:2]
patientsData[c("age","diabetes")]
patientsData$patientID
# 第四种 attach 将 数据框 放到了 r 的搜索路径中了。
attach(patientsData)
age
# 当然 也可以移除
detach(patientsData)
age

## 类似 attach ,有 with() 函数
with(patientsData,{
 x <- age
 x
})
?with
## 因子
## ！！列表
## 列表中每个元素类型，都可不相同。
## 访问列表具体位置元素：mylsit[[2]]
################################0919 R 常用命令
## 查看当前内存中 有哪些变量 区分大小写
ls()
## 当然，有对应的删除
rm()
## 其它
length()
mode() # 判断数据类型
c <- c(1,2,3,"r")
mode(c)
c[2] <- "change"
seq(1,10,2) # 序列函数 sqe()  起始1，截止10，间隔2 的序列
seq(5,10) # 循环生成 10 个 5
seq(1:3,3)
rnorm(10) # 
rnorm(6, mean = 6, sd = 2) # 均值6，标准差2
x <- c(0,-1,2,3,5)
x[x>0]
x[x<=2 | x>-1]
x[-2] # 将x中第2个值排除了
x[-(1:2)] # 将x中前2个进行排除

mylist <- list(stud.id=123,stud.name = "wang",stud.age = c(18,19,20))
## 注意mylist[1]  和 mylist[[1]] 是完全不同的，前者是 key和value，后者是value
mylist[1]
mode(mylist[1])
names(mylist)
names(mylist) <- c("name1","name2","name3") ## 修改表头名称
## 增加表数据
mylist$addName <- c("addName1","add2")
## 对应的，也可删除之
mylist <- mylist[-4]
## 两个list合并
allList <- c(mylist,otherList)

## 场景：循环便利list，那么就建议转为 向量 再进行循环
## unlist() 函数
mylist
unlist(mylist)

###############################0920 R导入数据源
## 方式1：从键盘
mydata <- data.frame(age=numeric(0),name=character(0),weight=numeric(0))
mydata <- edit(mydata)
mydata
#### 与之同的函数：fix(), 不用再赋值给mydata了。
fix(mydata)
## 方式2：文本文件txt 注意：路径是/ 不是\，不可直接复制
txtData <- read.table("D:/RTestForImport/RTxtTest.txt",header = TRUE,sep = ",")
head(txtData)
## 方式3：导入Excel
excelData <- read.csv("D:/RTestForImport/RExcel2.csv",header = TRUE,sep = ",")
head(excelData)
mode(excelData)
unlist(excelData)
excelData[[1]]
#############################0920 自定义函数
mydata <- function(type){
  switch (type,
    long = format(Sys.time(),"%A %B %d %Y"),
    short = format(Sys.time(),"%m-%d-%y"),
    cat(type, "is not recognized type\n")
  )
}
mydata("long")
mydata("short")
mydata("error")

# sum <- function(num){
#   for (i in 1:num) {
#     x <- x + num
#   }
# }
fix(sum)  ## 好用
print(sum(5))
fix(sum)
#############################0920 R访问MySQL数据库
## 1.安装RODBC包
## 2.在mysql中下载 connectors ODBC https://dev.mysql.com/downloads/connector/odbc/
## 3. windows：在window中添加设置数据源
install.packages("RODBC")
### 安装后，导进来
library(RODBC)
#### 第一种连接获取数据方式：启动连接命令  在 Windows 工具 中的 ODBC 连接中
myconn <- odbcConnect("scm_dev_kt_plan",uid="scm_dev_admin",pwd="ScmDev#Admin0209")
#### 根据连接获取 库中表
dataFromBase <- sqlFetch(myconn,"sop_final_assembly_capacity_ramp_up_plan_item")
head(dataFromBase)
### 第二种链接获取数据方式：
data2 <- sqlQuery(myconn,"select id from table")
## 注意，最后要 close
close(myconn)


####################正式进入 Rstudio  开始画图  plot()与par()函数可理解为配套使用，也可将par()中参数放到plot()中。
x <- c(1,24,5,26,7,34)
y <- c(1,24,5,26,7,34)
plot(x,y)
########### 颜色&类型 案例1 药物水平
dose <- c(20,30,40,45,60)
drugA <- c(16,20,39,40,60)
drugB <- c(15,18,39,32,40)
plot(dose,drugA,type="b")
#### 改为TRUE，说明可以修改所画的线格式
opar <- par(no.readonly = TRUE)
mode(opar)
par(lty=2,pch=17)  ## (虚线，三角符号) 注意：pch范围是 1~25
plot(dose,drugA,type="b")
par(opar)  ## 如果想要恢复最原始的 画图格式，则执行该命令
plot(dose,drugA,type="b")
#### 可改变 线条、节点 的大小 颜色
plot(dose,drugA,type="b",lty=2,pch=19,lwd=3,cex=3)
colours()  ### 获取所有可用颜色
plot(dose,drugA,type="b",lty=2,pch=19,cex=1,col="red",col.axis="blue",col.lab="black")
########### 设置 标题 文字 类型 大小 颜色
par(font.lab=3,cex.lab=1.5,font.main=4,cex.main=2)
plot(dose,drugA,type="b")
##### 查看电脑中 对pdf所支持的文字格式
names(pdfFonts())
##### 以上是文字的设置，以下是对 图形 的尺寸大小设置
par(opar)
par(pin=c(2,3)) ## 设置宽，高
par(lwd=2,cex=1.5) ## 线条宽度，符号大小
par(cex.axis=0.75,font.axis=3) ## 坐标轴文字大小，坐标轴文字字体样式
plot(dose,drugA,type="b",pch=19,lty=2,col="red")
plot(dose,drugB,type="b",pch=23,lty=6,col="blue",bg="green")

######################## 0921 设置标题 和 坐标轴 plot()玉title()函数可理解为配套使用，也可将title()中参数放到plot()中
######################### 想要在原图上再画曲线，则使用 lines() 函数
plot(dose,drugA,type="b",col="red",lty=2,pch=2,lwd=2,main = "药物A的反应曲线",
     sub="测试数据子标题",xlab="x轴标题:剂量",ylab="y轴标题:病人反应",
     xlim=c(10,80),ylim=c(10,70)) ## 注意这个 xlim() 函数

######################## 0921
dose <- c(20,30,40,45,60)
drugA <- c(16,20,27,40,62)
drugB <- c(15,18,25,31,40)
opar <- par(no.readonly = TRUE)
par(pin=c(2,3))  ## 关于图像大小
par(cex.axis=0.75,font.axis=3)
par(lwd=2,cex=1.5)
plot(dose,drugA,type="b",pch=23,lty=6,col="red",bg="green")
### 对标题 副标题 x,y轴的设置

## 标题：使用title（）
title(main="titleByTitle()",col.main="red")
title(sub="subTitleByTitle()",col.sub="green")
## 坐标轴：axis() 函数 比如坐标轴的起始刻度，效果与上面的xlim()同，
#####还可以具体设置哪些数字显示：比如 at(c(1,3,65))
########## 重新画图
x <- c(1:10)
y <- x
z <- 10/x
opar <- par(no.readonly = TRUE)
par(mar=c(5,4,4,8) + 0.1)  #### 图形的边界： mar()
plot(x,y,type="b",pch=21,col="red",yaxt="n",lty=3,ann = FALSE)  ### yaxt="n":把y轴的刻度清空，等后面自己设置；ann = FALSE：x轴y轴标题清空

axis(2, at=y,labels = x,col.axis="blue",las=2)  # las() 标签是平行=0 还是 垂直=2 坐标轴
################ 再加一条线 1.先画线 2.再设置坐标轴 3.再设置标题
lines(x,z,type="b",pch=22,col="green",lty=2)
axis(4,at=z,labels=round(z,digits=2),col.axis="black",las=2,cex.axis=0.7)
title(main="坐标轴测试",xlab="x轴",ylab = "y轴")

############################ 图形 次要刻度线、参考线、图例 和 文本标注
### 首先安装包：Hmisc
install.packages("Hmisc")
#### 重新画图 
########次要刻度线 minor.tick
plot(1:4,1:4,type="b")
minor.tick(nx=3,ny=2,tick.ratio=0.5)  ### 将目前x轴 每个单元分隔成3份，次要刻度线长度为基础单元格的0.5倍
?minor
install.packages("Hmisc")  #### !!! 注意：安装后，还需要导入，才能使用
library(Hmisc)
########参考线 abline()
abline(h=2,col="red",lty=2) ### 水平位置在2，红色，虚线 参考线
abline(v=2,col="green",lty=1) ### 垂直位置在2，绿色，实线 参考线
########图例 legend() 图例位置，图例名称

dose <- c(20,30,40,45,60)
drugA <- c(16,20,39,40,60)
drugB <- c(15,18,34,32,40)
plot(dose,drugA,type="b",pch=15,lty=1,col="red",ylim=c(0,60),main="药物A和B的对比",xlab="剂量",ylab="药物反应")
lines(dose,drugB,type = "b",pch=17,lty=2,col="blue")
minor.tick(nx=5,ny=2,tick.ratio = 0.5)
### 设置 图例
legend("topleft",inset = .05,title = "类型",legend = c("A","B"),lty = c(1,2),pch=c(15,17),col=c("red","blue"))

### 文本标注 使用text()函数 和 mtext()函数
head(mtcars)
attach(mtcars)       ### 注意：误忘这一步：把mtcars中的数据放到R内存中
plot(wt,mpg,main="车重和油耗关系",xlab = "车重",ylab="耗油量",pch=18,col="blue")
minor.tick(nx=5,ny=3,tick.ratio = 0.5)
########## 开始标注
text(wt,mpg,row.names(mtcars),cex = 0.5,pos=4,col = "red") ### 位置在右边，即4

####################################### 多个图形组合 布局 以及操作 layout() 以及 par()函数中的mfrow参数
###### par(mfrow=c(矩阵:x,y))
attach(mtcars)
opar <- par(no.readonly = TRUE)
par(mfrow=c(2,2))
plot(wt,mpg,main="wt vs mpg")
plot(wt,disp,main = "wt disp mpg")
hist(wt,main = "histopram of wt")
boxplot(wt,main="Boxplot of wt")
detach(mtcars)

par(mfrow=c(1,3))
hist(wt)
hist(mpg)
hist(disp)
par(opar)
####### 应对 第一行一个图，第二行两个图 使用 layout(矩阵matrix(c(1,1,2,3),几行，几列,byrow=true))  
####### 向量代表： 第一个图形占了2个位置，因为出现了2次。第2,3个图形分别占一个位置

layout(matrix(c(1,1,2,3),2,2,byrow=TRUE))
hist(wt)
hist(mpg)
hist(disp)

####### 进一步控制 各个图形所占比例 widths=c(3,1) 第一列是第2列的三倍；
#######                             heights=c(1,2) 第一行是第二行的二分之一
############## 注意：要先layout设置好后，再画图：plot,hist,boxplot等等
layout(matrix(c(1,1,2,3),2,2,byrow=TRUE),widths=c(3,1),heights=c(1,2))
hist(wt)
hist(mpg)
hist(disp)

####### 更加精细的布局控制 par()函数的fig参数 比如：有一个图放在正中央
attach(mtcars)
par(fig=c(0,0.8,0,0.8))
plot(wt,mpg,xlab="Gallon",ylab="weight")
######## 画第二个图
par(fig=c(0.65,1,0,0.8),new= TRUE)  ## 注意：在原图上画图新增，就要new=true
boxplot(mpg,axes=FALSE)  ## axes 代表 边框是否需要 连上
######## 画第三个图
par(fig=c(0,0.8,0.55,1),new = TRUE)
boxplot(wt,horizontal = TRUE,axes=FALSE)

# ============================================0922回到R的基本数据管理：变量
# ========= 现实应用：处理人事统计表格：比如年龄根本不合法的，为空值的等等
mydata <- data.frame(x1=c(1,2,3,4),x2=c(5,6,7,8))
mydata
x1
mydata$x1
sumx <- mydata$x1 + mydata$x2
ls()
mydata$sumx <- mydata$x1 + mydata$x2
mydata$sumx

mydata$meanx <- (mydata$x1 + mydata$x2)/2

mydata

## 开始造数
manager<-c(1,2,3,4,5)
date <- c("10/24/2008","10/28/2008","10/28/2008","10/28/2008","5/1/2008")
country <- c("US","US","UK","UK","Uk")
gender <- c("M","F","F","M","F")
age <-c(32,45,25,39,99)
q1<-c(5,3,3,3,2)
q2<-c(4,5,5,3,2)
q3<-c(5,2,5,4,1)
q4<-c(5,5,5,NA,2)
q5<-c(5,5,2,NA,1)
survey <- data.frame(manager, date, country, gender, age,q1,q2,q3,q4,q5)
survey
#### 将age=99的数据复制为NA
survey$age[survey$age == 99] <- NA
survey
#### 变量重命名 fix() 或者 names(survey)[6] <- name
fix(survey)
#### 补空值 is.na() 函数
survey[6:10]
x <- c(1,2,3,NA)
y <- sum(x,na.rm= TRUE)  ## 碰到为空的数据，给排除掉。否则，一个为na，则整个运算为na
dagta <- na.omit(survey)  ## 与na.rm() 不同之处：na.omit()是删除na元素所在的一整行，na.rm()是删除元素
#### 日期类型 Sys.Date() 精确到天，date() 精确到 秒
dataFrame <- as.Date(date,"%m/%d/%Y")   ## 两个数据可相减，得日期间的天数
format(Sys.Date(),format = "xxxxx")
#### R的类型转换 跳过
#### R的排序 order()
dataOrder <- survey[order(survey$age),] ## 注意，一定里面带一个 ， 号
dataOrder <- survey[order(survey$gender ,survey$age),]  ## 默认升序，加个-号，即为降序


########################### 0923 数据集的合并，提取子集 随机取样函数
### 将两个数据集合并, 按列合并：cbind(),rbind(),merge()  后者是有逻辑的，类似 内连接
x <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3,ncol=3)
y <- x
z <- cbind(x,y)
z <- rbind(x,y)
?merge
x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)
y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)
z <- merge(x,y,by="k1")  ## x.inner join y on x.k1 = y.k1  有匹配的才显示
### 获取子集
survey[6:10]
survey[-2]  ## 丢弃变量
newdata <- subset(survey,age>=35 | age<24, select=c(q1,q2,q3,q4)) ### 666
### 随机抽样  跳过
mysample <- survey[,sample(5,3,replace = FALSE)]


###########################  高级数据管理
bas() # 绝对值
sqrt() # 平方根
ceiling(2.123)
floor(2.123)
round(2.45) # 四舍五入
#### 统计函数
mean()  #求均值
sd() #标准差
var() #方差
## ？ 标准化
x <- c(1,2,3,4,5,6,7,8)
mean(x)
sd(x)
scale(x,center=TRUE,scale = FALSE)
#### 概率函数：dpqr 
x <- pretty(c(-3,3),30)
y <- dnorm(x) ## 注意,与z <- norm(x)不同，d是指 norm()函数的密度函数
plot(x,z)
#### 实用：根据正态分布，随机获取50个随机数
rnorm(50,mean=20,sd=8)
runif(5)
set.seed(2) ## 指定种子为2，生成伪正态分布随机数

############################# 高级数据管理：字符处理，其它实用函数，将函数应用于 矩阵 和 数据框
str <- "abcd"
nchar(str)
substr(str,3,5)
grep("a",c("a","c","a"))
sub("a","替换为A","abcd")
strsplit(str,"") ## 字符串分隔函数
paste("a","b") ## 拼接字符串
toupper() 
tolower()
seq(1,10,2)
rep(1:3,3)
cat()  ## 将内容输出屏幕
b <- matrix(runif(12),nrow=3)
c <- matrix(rnorm(30),nrow = 6)
#### 注意，此时再简单的使用mean()类函数，那么计算的是 b 整个值的平均值，
#### 如果想要具体到矩阵或者数据框中 指定的行 列 则如下
apply(c,1,mean)  ## 1：行，2：列
########## 拓展 lapply() sapply() 跳过

############################# 高级数据管理：重复 循环 条件执行 转置
for(i in 1:5) print("xadsfs")
#### 条件执行 if-else switch ifelse
ifelse(x>1,"是","否")
feeling<-c("","","")
switch
for(i in feeling)
  print (switch(i,happy = "i是happy",afraid= "i是afraid",sad="i是sad"))
##### 转置矩阵 t()
cars <- mtcars[1:5,1:4]
t(cars)

############################## 0924 R基本图形：条形图 barplot
##### 首先装vcd的包
install.packages("vcd")
barplot(c(1,2,3,4,5,6,7,8),horiz = TRUE)
?barplot
?Arthritis
library(vcd)  ### 勿忘这个：下载后，还得导入
?table
counts <- table(Arthritis$Improved)
counts <- table(Arthritis$Treatment)
sexs <- table(Arthritis$Sex)
counts <- table(Arthritis$Improved,Arthritis$Treatment)
barplot(counts)
barplot(counts,beside = TRUE)  ### 作用 从折叠，到横移打开
head(states)
states <- data.frame(state.region,state.x77)
x <- aggregate(states$Illiteracy,by=list(state.region),FUN=mean)  # 通过state.region分组，求states$Illiteracy数据的mean(),即平均值
x
barplot(x$x,names.arg = x$Group.1)
####### 开始 绘图微调
par(mar=c(5,8,4,2))
counts <- table(Arthritis$Improved)
#### 条形图 横过来，标签大小0.8，标签名
barplot(counts,horiz = TRUE,cex.names = 0.8,names.arg=c("No imporved","some imporved","marked improved"))
#### 旋转标签
par(las = 2)

############################## 0924 饼图 pie()
par(mfrow=c(2,2))
x <- c(10,12,4,16,8)
lab <- c("US","UA","CN","AU","RU")
pie(x,lab,main = "first pie")
### 计算比例
sum(x)
?sum
pct <- round(x/sum(x)*100)
labl <- paste(lab, ":",pct,"%",sep=" ")
ls()
rm(list = ls())

